iOS 11 UITableView刷新漂移/抖动

我们做了什么?

  • 在我们的APP中,静态界面一般很少使用,大部分的页面都是用了UITableView,用来动态展示信息,这里少不了使用动态布局方案,以及Cell的动态高度计算方案,其中就包括预设高度,以及手动动态计算等。在iOS 11 之前,我们可能不会有任何问题,当我们来到iOS 11之后,问题来了,预设高度,让系统根据布局来动态计算的方案,在有些时候就出现了刷新TableView漂移的现象。

苹果的tabieView动态展示方案

  • 在iOS 8中,苹果引入了UITableView 的一项新功能(Self Sizing Cells),在iOS 8之前,如果想在UITableView中展示可变高度的动态内容时,需要开发者手动计算行高,Self Sizing Cells 的引入,为动态展示动态内容提供了一个解决方案,这个方案对系统cell和xib都有效。

  • 根据苹果官方文档的解释:Self-Sizing开启之后,开发者不用再自己去计算cell的高度,只要设置好相关属性,约束好布局,系统会自动计算好cell的高度。

  • 在iOS 11之前,Self Sizing Cells是默认不开启的,当我们来到iOS 11后系统默认开启Self-Sizing,此时,如果我们手动计算高度,有没有关闭Self Sizing Cells相关属性,刷新TableView的时候就可能会出现漂移现象。

我们要做什么?

  • 如果你不需要系统帮你计算cells高度,那么我们就应该关闭Self Sizing Cells相关属性:

    self.tableView.estimatedRowHeight=0;
    self.tableView.estimatedSectionHeaderHeight = 0;
    self.tableView.estimatedSectionFooterHeight = 0;
    
  • 如果我们需要系统帮忙计算cells高度,那么我们就应该利用好相关的属性:

    self.tableView.estimatedRowHeight = 100; //  设置任意不等于0 的值
    self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.tableView.estimatedSectionHeaderHeight = 35;  // 如有需要也应该设置
    self.tableView.estimatedSectionFooterHeight = 35;  // 如有需要也应该设置